package rest

import (
	"errors"
	"github.com/gin-gonic/gin"
	"github.com/go-playground/validator/v10"
	"monoblog/common"
	"monoblog/domain/auth"
	"monoblog/domain/dto"
	"monoblog/domain/service"
)

/* 评论接口 */

// CommentsOfBlog 查看文章评论列表
func CommentsOfBlog(ctx *gin.Context) {
	blogId := ctx.Param("id")

	//获取评论列表
	comments, err := service.GetCommentService().CommentsByBlogID(ctx, blogId)
	if err != nil {
		common.Fail(ctx, "查看文章评论列表失败", err)
		return
	}
	common.Success(ctx, comments)
}

// CommentsFromMy 查看我的评论列表
func CommentsFromMy(ctx *gin.Context) {
	id := ctx.Param("id")

	common.Success(ctx, id)
}

// SubmitComment 提交评论
func SubmitComment(ctx *gin.Context) {
	var form dto.CommentReqForm
	if err := ctx.ShouldBind(&form); err != nil {
		common.Fail(ctx, "Body数据绑定失败", err)
		return
	}
	//初始化校验器并执行字段校验
	validate := validator.New()
	if err := validate.Struct(form); err != nil {
		common.Fail(ctx, "参数校验失败", err)
		return
	}

	if user, ok := ctx.Get("user"); ok {
		form.LoginUser = user.(*auth.LoginUser)
	} else {
		common.Fail(ctx, "用户未登录", errors.New("user not login"))
		return
	}

	//添加评论
	id, err := service.GetCommentService().Add(ctx, form)
	if err != nil {
		common.Fail(ctx, "添加评论失败", err)
		return
	}
	common.Success(ctx, id)
}

// LikeTheComment 评论点赞
func LikeTheComment(ctx *gin.Context) {
	id := ctx.Param("id") // 评论ID
	if id == "" {
		common.Fail(ctx, "id参数校验失败", errors.New("id is empty"))
		return
	}

	var userId string // 用户ID

	if user, ok := ctx.Get("user"); ok {
		userId = user.(*auth.LoginUser).UID
	}
	if userId == "" {
		common.Fail(ctx, "用户未登录", errors.New("user not login"))
		return
	}
	err := service.GetInterestService().LikeTheComment(ctx, id, userId)
	if err != nil {
		common.Fail(ctx, "评论点赞失败", err)
		return
	}

	common.Success(ctx, id)
}

// CancelLikeTheComment 取消评论点赞
func CancelLikeTheComment(ctx *gin.Context) {
	id := ctx.Param("id") // 评论ID
	if id == "" {
		common.Fail(ctx, "id参数校验失败", errors.New("id is empty"))
		return
	}

	var userId string // 用户ID

	if user, ok := ctx.Get("user"); ok {
		userId = user.(*auth.LoginUser).UID
	}
	if userId == "" {
		common.Fail(ctx, "用户未登录", errors.New("user not login"))
		return
	}
	err := service.GetInterestService().CancelLikeTheComment(ctx, id, userId)
	if err != nil {
		common.Fail(ctx, "评论点赞失败", err)
		return
	}

	common.Success(ctx, id)
}

// LikeTheBlog 文章点赞
func LikeTheBlog(ctx *gin.Context) {
	id := ctx.Param("id") // 文章ID
	var userId string     // 用户ID

	if user, ok := ctx.Get("user"); ok {
		userId = user.(*auth.LoginUser).UID
	}
	if userId == "" {
		common.Fail(ctx, "用户未登录", errors.New("user not login"))
		return
	}

	err := service.GetInterestService().LikeTheArticle(ctx, id, userId)
	if err != nil {
		common.Fail(ctx, "文章点赞失败", err)
		return
	}

	common.Success(ctx, id)
}

// CancelLikeTheBlog 取消文章点赞
func CancelLikeTheBlog(ctx *gin.Context) {
	id := ctx.Param("id") // 文章ID
	var userId string     // 用户ID

	if user, ok := ctx.Get("user"); ok {
		userId = user.(*auth.LoginUser).UID
	}
	if userId == "" {
		common.Fail(ctx, "用户未登录", errors.New("user not login"))
		return
	}

	err := service.GetInterestService().CancelLikeTheArticle(ctx, id, userId)
	if err != nil {
		common.Fail(ctx, "文章点赞失败", err)
		return
	}

	common.Success(ctx, id)
}

// FavoriteTheBlog 文章收藏
func FavoriteTheBlog(ctx *gin.Context) {
	id := ctx.Param("id") // 文章ID
	var userId string     // 用户ID

	if user, ok := ctx.Get("user"); ok {
		userId = user.(*auth.LoginUser).UID
	}
	if userId == "" {
		common.Fail(ctx, "用户未登录", errors.New("user not login"))
		return
	}

	err := service.GetInterestService().FavoriteTheArticle(ctx, id, userId)
	if err != nil {
		common.Fail(ctx, "文章收藏失败", err)
		return
	}

	common.Success(ctx, id)
}

// CancelFavoriteTheBlog 取消文章收藏
func CancelFavoriteTheBlog(ctx *gin.Context) {
	id := ctx.Param("id") // 文章ID
	var userId string     // 用户ID

	if user, ok := ctx.Get("user"); ok {
		userId = user.(*auth.LoginUser).UID
	}
	if userId == "" {
		common.Fail(ctx, "用户未登录", errors.New("user not login"))
		return
	}

	err := service.GetInterestService().CancelFavoriteTheArticle(ctx, id, userId)
	if err != nil {
		common.Fail(ctx, "取消文章收藏失败", err)
		return
	}

	common.Success(ctx, id)
}
